
package utilidades;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

import Inscripcion.Participante;

/**
 * @author Zhakarias
 *
 */

@WebListener
public class MyServletListenerParticipantes implements ServletContextListener {

	/* (non-Javadoc)
	 * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
	 */
	@Override
	public void contextDestroyed(ServletContextEvent event) {
		// Obtener el HashTable de participantes del servletContext
		HashMap<String, Participante> participantes = 
				(HashMap<String, Participante>) event.getServletContext().getAttribute("participantes");
		
		// Obtener la ruta del fichero de persistencia de participantes
		String rutaRelativa = "/WEB-INF/Persistencia/usuarios.xml";
		String rutaDisco = event.getServletContext().getRealPath(rutaRelativa);
		
		// Invocar al método de parseado de la estructura de datos que construye el XML
		Escritor.guardarParticipantes(rutaDisco,participantes);
	}

	/* (non-Javadoc)
	 * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
	 */
	@Override
	public void contextInitialized(ServletContextEvent event) {

		String rutaRelativa = "/WEB-INF/Persistencia/usuarios.xml";
		String rutaDisco = event.getServletContext().getRealPath(rutaRelativa);
		System.out.println(rutaDisco);
		HashMap<String, Participante> participantes = cargarUsuarios(rutaDisco);
		event.getServletContext().setAttribute("participantes", participantes);
		
	}

	
	/**
	 * Mátodo que carga los usuarios en el contexto de la aplicación 
	 *
	 * @param rutaDatosUsuarios
	 * @return
	 */
	private HashMap<String, Participante> cargarUsuarios(String rutaDatosUsuarios) {

		HashMap<String, Participante> dev = new HashMap<String, Participante>();
		
		try {
			  DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			  DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
			  Document doc = dBuilder.parse(new File(rutaDatosUsuarios));
			  doc.getDocumentElement().normalize();

			  System.out.println("El elemento raíz es: " + doc.getDocumentElement().getNodeName());
			  NodeList listaPersonas = doc.getElementsByTagName("Usuario");

			  for (int i = 0; i < listaPersonas.getLength(); i ++) {

			    Node persona = listaPersonas.item(i);

			    if (persona.getNodeType() == Node.ELEMENT_NODE) {

		            Element elemento = (Element) persona;

		            System.out.println("Nombre : " + getTagValue("Nombre", elemento));
		            System.out.println("Apellido1 : " + getTagValue("Apellido1", elemento));
		            System.out.println("Apellido2 : " + getTagValue("Apellido2", elemento));
		            System.out.println("Fecha : " + getTagValue("Fecha", elemento));
		            System.out.println("Sexo : " + getTagValue("Sexo", elemento));
		            Participante p = getParticipante(elemento);
		            
		            
		          //Insertamos el usuario en nuestra tabla
					String clave = p.getUserID();
					dev.put(clave, p);
		            
			    }
		    }
		  } catch (Exception e) {
		    e.printStackTrace();
		  }
		  
		return dev;
	}

	/**
	 * Extrae la información de participante contenida en el elm pasado como parámetro
	 * 
	 * @param elm
	 * @return
	 */
	private Participante getParticipante(Element elm) {
		
		String uid = elm.getAttribute("uid");
		String nombre = getTagValue("Nombre",elm);
		String apellido1 = getTagValue("Apellido1",elm);
		String apellido2 = getTagValue("Apellido2",elm);
		String fecha = getTagValue("Fecha",elm);
		String sexo = getTagValue("Sexo",elm);
		
		return new Participante(nombre, apellido1, apellido2, uid, fecha, sexo);
	}
	
	/**
	 * Devuelve el valor del hijo con etiqueta sTag del elemento de jDom elm
	 * 
	 * @param sTag
	 * @param elm
	 * @return String con el valor del nodo
	 */
	private static String getTagValue(String sTag, Element elm) {
		NodeList nlList = elm.getElementsByTagName(sTag).item(0).getChildNodes();
	 
		Node nValue = (Node) nlList.item(0);
	 
		return nValue.getNodeValue();
	}
}
